iT邦幫忙

DAY 7
1

21世紀C語言實作及感想系列 第 7

21世紀C語言之7 :好朋友->指標

  • 分享至 

  • xImage
  •  

第一個範例,static 的用法

算費式數列到50項,

#include <stdio.h>

long long int fibonacci(){
    static long long int first = 0;
    static long long int second = 1;
    long long int out = first+second;
    first=second;
    second=out;
    return out;
}

int main(){
    for (int i=0; i< 50; i++)
        printf("%lli\n", fibonacci());
}

作者是介紹static, 每次進入函數,離開函數,基本上static 變數,值會留下,

即使宣告在函數的內部。看著他寫 long long很有意思,我改成long long long ,

--------------------------------------
long long long int fibonacci(){
    static long long long int first = 0;
    static long long long int second = 1;
---------------------------------------

多一個long, make 一下,

訊息是,

fibo_long.c:6:11: error: ‘long long long’ is too long for GCC
long long long int fibonacci(){
^

這個error訊息挺白話的,3個long太長了,對GCC而言。

第二個範例是結構的複製

#include <assert.h>

typedef struct{
    int a, b;
    double c, d;
    int *efg;
} demo_s;

int main(){
    demo_s d1 = {.b=1, .c=2, .d=3, .efg=(int[]){4,5,6}};
    demo_s d2 = d1;

    d1.b=14;
    d1.c=41;
    d1.efg[0]=7;

    assert(d2.a==0);
    assert(d2.b==1);
    assert(d2.c==2);
    assert(d2.d==3);
    assert(d2.efg[1]==6);
}

一行指令就可以demo_s d2 = d1; 複製結構。

a 沒有給值,是0,這點比較特別。

試試改一下assert裏的判斷式,

copystructs_ass: copystructs_ass.c:24: main: Assertion `d2.efg[1]==6' failed.
已經終止 (core dumped)

一遇到錯,就終止。

第3個例子

int main(){
    int abc[] = {0, 1, 2};
    int *copy = abc;

    copy[0] = 3;
    assert(abc[0]==3);

例2和例3 對比,終於看出作者要表達的意思。

例3 把陣列指向指標時,基本上是佔用同一位址。所以改指標指向的值,原陣列會被改變。

例2 把結構d2 = 結構d1, 分佔不同的位址,所以改結構d1, d2並不會被影響到,但是結構中有一成員是指標,這是這個成員,d1和d2是共用位址的,所以d1.efg[0] 改動,d2.efg[0]會一起改。

小結:筆者學語言,很少學得很細,所以這些很基礎的觀念,十年前,可能看過就忘了,並不了解其意思。作者精心設計的範例,讓人反覆看了幾遍,能理解其深意。作者舉的例子短小卻深刻。


上一篇
21世紀C語言之6 :Here Document
下一篇
21世紀C語言之8 :指標(續)
系列文
21世紀C語言實作及感想30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言